package com.yunji.bid.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 描述：redis配置类
 *
 *      redis序列化方式选择：
 *          1、(默认的)JdkSerializationRedisSerializer序列化方式，其编码为 ISO-8859-1，会出现乱码问题；
 *          2、StringRedisSerializer序列化方式，其编码为 UTF-8，可以解决乱码问题；
 *
 */
@Configuration
public class RedisConfig {
    @Resource
    RedisTemplate<Object, Object> redisTemplate;

    @Bean
    public RedisTemplate<Object,Object> redisTemplateInit(){
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
    public void setRedisTemplate(RedisTemplate redisTemplate) {
// JdkSerializationRedisSerializer  jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();

        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                GenericJackson2JsonRedisSerializer();
// 设置值（value）的序列化采用 FastJsonRedisSerializer。
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);

// 设置键（key）的序列化采用 StringRedisSerializer。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
    }
    // 4 配置 redisCacheManager
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory
                                                  redisConnectionFactory) {
// 生成一个默认配置，通过 config 对象即可对缓存进行自定义配置
        RedisCacheConfiguration config =
                RedisCacheConfiguration.defaultCacheConfig();
        config = config.entryTtl(Duration.ofMinutes(1))
                // 设置缓存的默认过期时 间，也是使用 Duration 设置
                .disableCachingNullValues(); // 不缓存空值
// 设置一个初始化的缓存空间 set 集合 可以指定需要缓存的内容缓存在那个空间下
        Set<String> cacheNames = new HashSet<>();
        cacheNames.add("timeGroup");
        cacheNames.add("emp");
// 对每个缓存空间应用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("timeGroup", config);
        configMap.put("emp", config.entryTtl(Duration.ofSeconds(120)));
        RedisCacheManager cacheManager =
                RedisCacheManager.builder(redisConnectionFactory)
                        // 使用自定义的缓存配置初始化一个 cacheManager
                        .initialCacheNames(cacheNames)
                        // 注意这两句的调用顺序，一定要先调用该方法设置初始化的缓存名，再初始化相关的配置
                        .withInitialCacheConfigurations(configMap).build();
        return cacheManager;
    }
}
